package com.sxpi.course.feign.callback;

import com.sxpi.common.result.R;
import com.sxpi.course.dto.CourseDto;
import com.sxpi.course.feign.api.CourseServiceFeign;
import com.sxpi.course.vo.CoursePriseVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;

/**
 * @Author: 董伟豪
 * @Date: 2022/10/7 14:29
 *
 * 因为openfegin的fallback和fallbackfactory机制是一个容错机制，之前旧版本中使用hystrix进行处理，
 * 所以如果在旧版本你必须要依赖hystrix和开始openfeign对hystrix的支持才会进行fallback和fallbackfactory的容错兜底方案中。
 * 但是在spring-cloud的2000版本以后就移除了hystrix全部改用和支持了alibabacloud的sentinel。
 * 底层逻辑feign容错已经修改成sentinel.所以你必须依赖sentinel和fegin.sentinel.enable=true才可以进行fallback和fallbackfactory容错处理。
 * 这也就是为啥不进入fallbackfactory的原因。
 */
@Slf4j
@Component
public class CourseServiceFeignFeignCallback implements FallbackFactory<CourseServiceFeign> {

    @Override
    public CourseServiceFeign create(Throwable cause) {
        // 打印一下
        cause.printStackTrace();
        // 输出日志,方便后面进行elk
        log.error("UserServiceHttp error:", cause);

        return new CourseServiceFeign() {

            @Override
            public R findCoursePage(CourseDto courseDto) {
                return R.error("1课程，进入兜底");
            }

            @Override
            public R findCategories() {
                return R.error("2课程，进入兜底");
            }

            @Override
            public R getCourseDetail(Long id) {
                return R.error("3课程，进入兜底");
            }

            @Override
            public R findCoursePageRelation(CourseDto courseDto) {
                return R.error("4课程，进入兜底");
            }

            @Override
            public R getChapterLessonDetail(Long courseId) {
                return R.error("5课程，进入兜底");
            }

            @Override
            public R getChapterLessonDetailMap(Long courseId) {
                return R.error("6课程，进入兜底");
            }

            @Override
            public R findSentinelByZeroTest() {
                return R.error("7课程，进入兜底");
            }

            @Override
            public R insertCoursePrise(CoursePriseVo coursePriseVo) {
                return null;
            }

            @Override
            public R selectByCourseIdAndUserId(Long courseId, Long userId) {
                return null;
            }

            @Override
            public R countByCourseId(Long courseId) {
                return null;
            }

            @Override
            public R cancelCoursePrise(Long courseId, Long userId) {
                return null;
            }

            @Override
            public R getCoursePriseRank() {
                return null;
            }

            @Override
            public R insertCoursePriseLock(CoursePriseVo coursePriseVo) {
                return null;
            }
        };
    }
}
